package cn.b.sky.shop.storage.service;

import cn.b.sky.shop.storage.Bucket;
import cn.b.sky.shop.storage.CloudObjectMetadata;
import cn.b.sky.shop.storage.ProgressListener;
import cn.b.sky.shop.storage.exception.StorageException;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.List;

/**
 * @Author: lidapeng
 * @Description:
 * @Date Created in 8/17/23 1:30 PM
 * @Modified By: lidapeng
 * Copyright(c) dbappsecurity.com.cn
 */
public interface CloudStorageClient {

    /**
     * 判断是否存在桶
     * @param object 对象
     */
    boolean bucketExists(String object);
    /**
     * 创建桶
     * @param bucket 桶
     * @param region 区域
     */
    void createForBucket(String bucket, String region);

    /**
     * 桶列表
     * @return
     */
    public List<Bucket> listBuckets();

    /**
     * 删除桶
     * @param bucket
     * @param region
     */
    public void removeBucket(String bucket, String region);


    /**
     * 存储对象
     * @param objectName 对象名
     * @param object 对象内容，byte，file，stream等
     * @param metadata 文件的基本信息
     * @param progressListener 监听器
     */
    void putObject(String objectName, Object object, CloudObjectMetadata metadata, ProgressListener progressListener);

    /**
     * 获取对象流转存到本地文件
     * @param bucket
     * @param localStorage 存储本地文件
     * @param listener 进度监听器
     * @return
     */
    public  CloudObjectMetadata transForLocalFile(String object, File localStorage);


    /**
     * 通过服务器端从另一个对象复制数据来创建一个对象
     * @param srcObject
     * @param destObject
     * @param progressListener
     * @throws StorageException
     */
    void copy(String srcObject, String destBucket, String destObject, ProgressListener progressListener) throws StorageException;


    /**
     * 获取对象流
     * @param object
     * @param listener
     * @return
     */
    public InputStream getObject(String object);


    /**
     * 下载对象到本地文件
     * @param object
     * @param filePath
     * @param listener 下载监控事件
     */
    public void downloadObject(String object, String filePath, ProgressListener listener);
    /**
     * 获取对象的基本信息
     * @param object
     * @return
     */
    CloudObjectMetadata getObjectMeta(String object);


    /**
     * 获取一个指定了 HTTP 方法、到期时间和自定义请求参数的对象URL地址，
     * 也就是返回带签名的URL，这个地址可以提供给没有登录的第三方共享访问或者上传对象。
     * @param method
     * @param object
     * @param expireSeconds
     * @return
     */
    public String getPresignedObjectUrl(String method, String object, int expireSeconds);


    /**
     *
     * @param object
     * @param fileName
     * @param expireSeconds
     * @return URL
     */
    public URL getPresignedObject(String object, String fileName, int expireSeconds);

    /**
     * 删除对象
     */
    void removeObject(String object);





}
